/**
 * 全局数据字典工具
 * 在本地保存和更新字典
 * ** 建议在退出登录时清除字典，或设定字典保存的周期
 * @fmy 2023/5/17
 */
import { getSysDictByName } from '@/api';
let Dict = new Map();
// let DictById = new Map(); // 以id为索引的集合

// 初始化字典
export async function initDict() {
    try {
        await updateData();
    } catch (error) {
        console.error('初始化字典失败', error);
    }
}

/**
 * 获取某个字典的所有字典项
 * @param {String} dictName 字典名
 * @param {String} isLatest 是否请求最新数据（默认使用本地数据）
 * @returns {Array<{}>} 该字典的子项
 */
export async function getDict(dictName, isLatest = false) {
    try {
        if (Dict.size === 0) await initDict();
        if (isLatest) {
            await popDictItem(dictName);
        }
        const dictItem = Dict.get(dictName);
        if (dictItem) {
            return dictItem;
        } else {
            try {
                await popDictItem(dictName);
                const dictItem = Dict.get(dictName);
                return dictItem;
            } catch (error) {
                console.log('字典获取失败: getDict', error);
                return [];
            }
        }
    } catch (error) {
        console.log('字典获取错误: getDict', error);
        return [];
    }
}

/**
 * 请求接口并将字典项插入Dict
 * @param {*} dictName 
 */
export async function popDictItem(dictName) {
    try {
        const { data } = await getSysDictByName(dictName);
        if (data) {
            Dict.set(dictName, data);
            // 更新
            updateData();
            return true;
        } else {
            return false;
        }
    } catch (error) {
        console.error(`字典 ${dictName} 获取失败: `, error);
        return false;
    }
}

// 通过key获取字典中文名
export async function getDictLable(dictName, key) {
    const dict = await getDict(dictName);
    return dict.find(v => v.dictKey == key)?.dictLabel;
}
//  通过中文名获取字典key
export async function getDictKey(dictName, lable) {
    const dict = await getDict(dictName);
    return dict.find(v => v.dictLabel == lable)?.dictKey;
}


/**
 * 更新数据
 */
function updateData() {
    return new Promise((resolve, reject) => {
        // 本地持久化字典数据
        uni.setStorage({
            key: 'Dict',
            data: JSON.stringify([...Dict]),
            success() {
                const data = uni.getStorageSync('Dict');
                Dict = new Map(JSON.parse(data));
                resolve(Dict);
                // console.log('storage -- Dict:', Dict);
            },
            fail(e) {
                console.log('更新字典失败');
                reject(e);
            }
        });
    })
}


//--- 便捷查询的方法 -----
export function getLable(dict, key) {
    return dict.find(v => v.dictKey == key).dictLabel;
}
export function getKey(dict, lable) {
    return dict.find(v => v.dictLabel == lable).dictKey;
}